package edualuc.game.JogoGalinhaDroid;
import java.util.ArrayList;
import java.util.Random;

public class Cenario {
	private String imagem;
	private int dimensaoX;
	private int dimensaoY;
	private ArrayList<Veiculo> veiculos;
	private ArrayList<Galinha> galinhas;
	private ArrayList<Galinha> galinhasMortas;
	private final int quantidadeGalinhaInicial = 10;
	public final int distanciaMinimaEntrePersonagens = 30;

	public Cenario() {
		this(240, 320);
		
	}
	
	public Cenario(int width, int height) {
		setDimensaoX(width);
		setDimensaoY(height);
		setVeiculos(new ArrayList<Veiculo>());
		setGalinhas(new ArrayList<Galinha>());
		setGalinhasMortas(new ArrayList<Galinha>());
		criarVeiculosIniciais();
		criarGalinhasIniciais();
	}

	private void criarVeiculosIniciais() {
		inserirVeiculo(new Veiculo(20, 20, 4, Direcao.gerarAleatorio()));
	}

	private void criarGalinhasIniciais() {
		for (int indiceDaGalinha = 0; indiceDaGalinha < quantidadeGalinhaInicial; indiceDaGalinha++) {
			criarGalinhaAleatoria();
		}
	}

	public void criarGalinhaAleatoria() {
		Random PosRandomica = new Random();
		Galinha novaGalinha = new Galinha(PosRandomica.nextInt(this
				.getDimensaoX() - 40) + 20, PosRandomica.nextInt(this
				.getDimensaoY() - 40) + 20, PosRandomica.nextInt(3) + 1, Direcao.gerarAleatorio());
		
		inserirGalinha(novaGalinha);
	}
	
	private void inserirGalinha(Galinha galinha) {
		if (verificaSePodeInserir(galinha)) 
			getGalinhas().add(galinha);
		else {
			galinha.mover();
			inserirGalinha(galinha);
		}
	}

	public void substituirVeiculo(int indiceDoCarro, Veiculo veiculo) {
		getVeiculos().set(indiceDoCarro, veiculo);
	}

	public void inserirVeiculo(Veiculo veiculo) {
		getVeiculos().add(veiculo);
	}

	public float atropelarGalinha(Galinha galinha) {
		float pontuacaoDaGalinha = 0;
		if (getGalinhas().remove(galinha)) {
			pontuacaoDaGalinha = galinha.morrer();
			getGalinhasMortas().add(galinha);
		}
		return pontuacaoDaGalinha;
	}

	public void substituirGalinha(int indiceDaGalinha, Galinha galinha) {
		getGalinhas().set(indiceDaGalinha, galinha);
	}

	private boolean verificaSePodeInserir(Galinha galinha) {
		double distancia;
		
		for(int indiceDaGalinha = 0; indiceDaGalinha < getGalinhas().size(); indiceDaGalinha++) {
			distancia = calcularDistanciaEntrePersonagens(galinha.proximoPasso(), getGalinha(indiceDaGalinha));
			if (distancia < distanciaMinimaEntrePersonagens && getGalinha(indiceDaGalinha) != galinha)
				return false;
		}
		return true;
	}
	
	public boolean galinhaNaoTemObstaculos(Galinha galinha) {
		double distancia;
		int indiceDaGalinha = 0;
		
		while ( indiceDaGalinha < getGalinhas().size() ) {
			distancia = calcularDistanciaEntrePersonagens(galinha.proximoPasso(), getGalinha(indiceDaGalinha));
			if (distancia < distanciaMinimaEntrePersonagens && getGalinha(indiceDaGalinha) != galinha)
				return false;
			indiceDaGalinha++;
		}
		return true;
	}
	
	public boolean naoEstaNaBordas(Personagem personagem) {
		Personagem proximoPasso = personagem.proximoPasso();
		if (proximoPasso.getCoordenadaX() <= 0) {
			return false;
		} else if (proximoPasso.getCoordenadaX() >= getDimensaoX()) {
			return false;
		} else if (proximoPasso.getCoordenadaY() <= 0) {
			return false;
		} else if (proximoPasso.getCoordenadaY() >= getDimensaoY()) {
			return false;
		}
		return true;
	}
	
	public double calcularDistanciaEntrePersonagens(Personagem personagem1, Personagem personagem2) {
		int distanciaEixoX, distanciaEixoY;
		
		distanciaEixoX = personagem1.getCoordenadaX() - personagem2.getCoordenadaX();
		distanciaEixoY = personagem1.getCoordenadaY() - personagem2.getCoordenadaY();
		
		return Math.sqrt(Math.pow(distanciaEixoX, 2) + Math.pow(distanciaEixoY, 2));
	}

	private void setVeiculos(ArrayList<Veiculo> veiculos) {
		this.veiculos = veiculos;
	}

	public ArrayList<Veiculo> getVeiculos() {
		return veiculos;
	}

	public Veiculo getVeiculo(int indiceDoCarro) {
		return (Veiculo) getVeiculos().get(indiceDoCarro);
	}

	private void setGalinhas(ArrayList<Galinha> galinhas) {
		this.galinhas = galinhas;
	}

	public ArrayList<Galinha> getGalinhas() {
		return galinhas;
	}

	public Galinha getGalinha(int indiceDaGalinha) {
		return (Galinha) getGalinhas().get(indiceDaGalinha);
	}

	private void setGalinhasMortas(ArrayList<Galinha> galinhasMortas) {
		this.galinhasMortas = galinhasMortas;
	}

	public ArrayList<Galinha> getGalinhasMortas() {
		return galinhasMortas;
	}

	public void setGalinhaMorta(int indiceDaGalinha, Galinha galinhaMorta) {
		ArrayList<Galinha> galinhasMortas = getGalinhasMortas();
		galinhasMortas.set(indiceDaGalinha, galinhaMorta);
		setGalinhasMortas(galinhasMortas);
	}

	public Galinha getGalinhaMorta(int indiceDaGalinha) {
		return (Galinha) getGalinhasMortas().get(indiceDaGalinha);
	}

	public void setDimensaoX(int dimensaoX) {
		this.dimensaoX = dimensaoX;
	}

	public int getDimensaoX() {
		return dimensaoX;
	}

	public void setDimensaoY(int dimensaoY) {
		this.dimensaoY = dimensaoY;
	}

	public int getDimensaoY() {
		return dimensaoY;
	}

	public void setImagem(String imagem) {
		this.imagem = imagem;
	}

	public String getImagem() {
		return imagem;
	}

	public void limparGalinhaMorta(int indiceDaGalinhaMorta) {
		getGalinhasMortas().remove(indiceDaGalinhaMorta);
	}

}
